package com.zhiyou100.review.day003.homework;

import java.util.Arrays;

/**
 * @packageName: HomeWork2
 * @className: com.zhiyou100.review.day003.homework
 * @Description: TODO 作业
 * @author: yang
 * @date: 2020/6/3
 */
public class HomeWork2 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(getTenToThousandAllPerfectNumbers()));

        System.out.println(getsTheSecondLargestValue(getTenToThousandAllPerfectNumbers()));


    }

    /**
     * @Description: TODO  打印数组
     * @name: `printStart`
     * @param: [in]
     * @return: void
     * @date: 2020/6/3 7:58 下午
     * @auther: yang
     */

    public static void printStart(int[] in) {
        for (int value : in) {
            for (int j = 1; j <= value; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    /**
     * @Description: TODO 四舍五入保留1位小数
     * @name: myRound
     * @param: [in]
     * @return: double
     * @date: 2020/6/3 7:56 下午
     * @auther: yang
     */

    public static double myRound(double in) {
        int tenths = (int) (in * 10.0 % 10);
        // tenths 获取十分上的数
        int percentile = (int) (in * 100.0 % 10);
        // percentile 获取百分位上的数字
        int integer = (int) (in);
        // integer 获取整数

        if (tenths == 0 && percentile == 0) {
            // 如果10分位和百分位都是0    1.00
            return integer;
        } else if (percentile == 0) {
            // 如果百分位是0    1.10
            return integer + (0.1 * tenths);
        } else if (tenths == 0) {
            // 如果是10分位是0 1.01
            return integer;
        } else {
            // 正常情况
            if (percentile < 5) {
                // 百分位 < 5   1.34
                return integer + (0.1 * tenths);
            } else {
                // 百分位 > 5    1.36
                return integer + (0.1 * (tenths + 1));
            }
        }

    }

    /**
     * @Description: TODO 对double类型的数组中的每个元素进行四舍五入
     * @name: myRound
     * @param: [into]
     * @return: double[]
     * @date: 2020/6/3 7:24 下午
     * @auther: yang
     */

    public static double[] myRoundDoubleArray(double[] into) {
        for (int i = 0; i < into.length; i++) {
            // 遍历数组
            into[i] = myRound(into[i]);
        }

        return into;
    }


    /**
     * @Description: TODO 获取次大值
     * @name: getsTheSecondLargestValue
     * @param: [arr]
     * @return: int
     * @date: 2020/6/3 7:16 下午
     * @auther: yang
     */

    public static int getsTheSecondLargestValue(int[] arr) {
        int[] copyOf = Arrays.copyOf(arr, arr.length);
        // 拷贝一个新的数组

        Arrays.sort(copyOf);
        // 从小到大排序

        int max = copyOf[copyOf.length - 1];
        // 获取最大值

        int greatValue = 0;
        // 记录次大值

        for (int i = copyOf.length - 1; i >= 0; i--) {
            // 倒叙遍历
            if (max != copyOf[i]) {
                // 找到第1个不等于最大值的数字
                greatValue = copyOf[i];
                break;
                // 跳出
            }

        }

        return greatValue;
    }

    /**
     * @Description: TODO  获取10到10000内所有的完数
     * @name: getTenToThousandAllPerfectNumbers
     * @param: []
     * @return: int[]
     * @date: 2020/6/3 7:12 下午
     * @auther: yang
     */

    public static int[] getTenToThousandAllPerfectNumbers() {
        int[] arr = new int[getTenToThousandAllPerfectNumber()];
        int max = 10000;
        int min = 10;
        for (int i = min, t = 0; i < max; i++) {
            if (judgmentCompletionOfSeven(i)) {
                // 如果是完数
                arr[t++] = i;
            }
        }
        return arr;
    }

    /**
     * @Description: TODO  获取10到1000所有完数的个数
     * @name: getTenToThousandAllPerfectNumber
     * @param: []
     * @return: int
     * @date: 2020/6/3 7:08 下午
     * @auther: yang
     */

    public static int getTenToThousandAllPerfectNumber() {
        int cnt = 0;
        // 计数
        int max = 10000;
        int min = 10;
        for (int i = min; i <= max; i++) {
            if (judgmentCompletionOfSeven(i)) {
                // 如果是完数
                cnt++;
            }
        }
        return cnt;
    }

    /**
     * @Description: TODO 判断是不是完数
     * @name: judgmentCompletionOfSeven
     * @param: [num]
     * @return: boolean
     * @date: 2020/6/3 7:04 下午
     * @auther: yang
     */

    public static boolean judgmentCompletionOfSeven(int num) {
        int[] array = new int[num + 1];
        for (int i = 1, j = 0; i < num; i++) {
            if (num % i == 0) {
                array[j] = i;
                j++;
            }
        }
        int sum = 0;
        for (int value : array) {
            sum += value;
        }

        return num == sum;

    }
}
